#include <QPainter>
#include <cmath>
#include "gas.h"
#include <time.h>

int gas::rozmiar = 300; // ilosc kulek

gas::gas(QWidget *parent)
    : QMainWindow(parent) {
    t = 0;
    srand(time(NULL));
    timerId = startTimer(15); //timer
    list = new Ball[rozmiar];
    int max_predkosc = 10;
    for (int i = 0; i < rozmiar; ++i) { //podzielenie kulek na dwie czesci
        if (i > 150)
            list[i] = Ball(10+rand()%800, 400+rand()%200, 0, 0, 1); //ustawienie statycznych (poczatkowo) kulek po lewej stronie
        else
            list[i] =Ball(10+rand()%800, 10+rand()%200, 0, (rand()%(max_predkosc)+1), 1); // ustawienie poruszajacych sie kulek (poczatkowo)
    }
}

gas::~gas() {}

void gas::paintEvent(QPaintEvent *event) {
    int min_x = 0, min_y = 0, max_x = 800, max_y = 600; // rozmiar okna
    QPen pen(Qt::black, 2, Qt::SolidLine);
    QPainter painter(this);
    painter.setPen(pen);
    painter.setBrush(Qt::SolidPattern);

    painter.drawLine(min_x, min_y, min_x, max_y);
    painter.drawLine(max_x, min_y, max_x, max_y);
    painter.drawLine(min_x, max_y, max_x, max_y);
    painter.drawLine(max_x, min_y, min_x, min_y);

    for (int i = 0; i < this -> rozmiar; ++i) { //przesowa i sprawdza czy nie wystapila kolizja ze sciana
        list[i].move();
        wall_zderzenie(list[i]);
    }

    for (int i = 0; i < this -> rozmiar - 1; ++i) { // przesowa i sprawdza czy nie wystapila kolizaj z kulka
        for (int j = i + 1; j < this -> rozmiar; ++j) {
            double distance_x = (list[i].ret_center().x() - list[j].ret_center().x());
            double distance_y = (list[i].ret_center().y() - list[j].ret_center().y());
            double distance = sqrt(pow(distance_x, 2) + pow(distance_y, 2));
            if ((distance <= (list[i].ret_promien() + list[j].ret_promien())) && ((list[i].ret_zderzenie() == false) && (list[j].ret_zderzenie() == false))) {
                list[i].set_zderzenie(true);
                list[j].set_zderzenie(true);
                ball_zderzenie(list[i], list[j]);
            }
            else if (distance > (list[i].ret_masa() + list[j].ret_masa())) {
                list[i].set_zderzenie(false);
                list[j].set_zderzenie(false);
            }
        }
    }

    for (int i = 0; i < this -> rozmiar; ++i) { // rysuje 300 kulek
        if (i > 150)
            painter.setPen(QPen(Qt::red, 3, Qt::SolidLine)); // 150 czerwonych
        else
            painter.setPen(QPen(Qt::black, 3, Qt::SolidLine));
        painter.drawEllipse(list[i].ret_center(), list[i].ret_promien(), list[i].ret_promien());// czarnych
    }
    return;
}

void gas::timerEvent(QTimerEvent *event) {
    ++t;
    repaint();
    if(t == 2)
        //Sleep(5);
    return;
}
